/**
 * 修复宿舍容量超员问题的脚本
 * 此脚本会检查所有宿舍，如果超过容量，会保留前N名学生（N为最大容量），并清空其他学生的宿舍分配
 */

const fs = require('fs');
const path = require('path');

// 读取数据文件
const studentsPath = path.join(__dirname, 'data', 'students.json');
const dormitoriesPath = path.join(__dirname, 'data', 'dormitories.json');

const students = JSON.parse(fs.readFileSync(studentsPath, 'utf8'));
const dormitories = JSON.parse(fs.readFileSync(dormitoriesPath, 'utf8'));

console.log('开始检查宿舍容量问题...\n');

const fixes = [];

// 检查每个宿舍
dormitories.forEach(dorm => {
  const dormMembers = students.filter(student => 
    student.dormBuilding === dorm.buildingName && 
    student.dormRoom === dorm.roomNumber
  );
  
  const maxCapacity = dorm.totalBeds || dorm.maxCapacity || 4;
  
  if (dormMembers.length > maxCapacity) {
    console.log(`发现超员: ${dorm.buildingName} ${dorm.roomNumber}`);
    console.log(`  最大容量: ${maxCapacity}人`);
    console.log(`  当前入住: ${dormMembers.length}人`);
    console.log(`  超员: ${dormMembers.length - maxCapacity}人`);
    console.log(`  学生列表:`);
    dormMembers.forEach((m, i) => {
      console.log(`    ${i + 1}. ${m.name} (${m.studentId}) - ${m.gender || '未知'} - 状态: ${m.status || 'active'}`);
    });
    
    // 按照优先级保留学生：优先保留状态为active的学生，然后按id排序（越早的保留）
    const sortedMembers = dormMembers.sort((a, b) => {
      // 优先保留active状态的学生
      if (a.status === 'active' && b.status !== 'active') return -1;
      if (a.status !== 'active' && b.status === 'active') return 1;
      // 其次按id排序
      return (a.id || 0) - (b.id || 0);
    });
    
    // 需要移除的学生（超过容量的部分）
    const toRemove = sortedMembers.slice(maxCapacity);
    
    fixes.push({
      dorm: `${dorm.buildingName} ${dorm.roomNumber}`,
      maxCapacity,
      currentCount: dormMembers.length,
      toRemove: toRemove.map(s => ({
        id: s.id,
        name: s.name,
        studentId: s.studentId
      }))
    });
    
    console.log(`\n  建议移除以下学生:`);
    toRemove.forEach(s => {
      console.log(`    - ${s.name} (${s.studentId})`);
    });
    console.log('\n');
  }
});

if (fixes.length === 0) {
  console.log('✓ 未发现容量超员问题');
  process.exit(0);
}

console.log(`\n共发现 ${fixes.length} 个宿舍存在超员问题\n`);
console.log('如果要自动修复，请运行: node fix-dormitory-capacity.js --fix');
console.log('注意: 这将清空超员学生的宿舍分配信息\n');

// 如果传入 --fix 参数，执行修复
if (process.argv.includes('--fix')) {
  console.log('开始修复...\n');
  
  let fixedCount = 0;
  
  fixes.forEach(fix => {
    const dormInfo = fix.dorm.split(' ');
    const buildingName = dormInfo[0];
    const roomNumber = dormInfo[1];
    
    fix.toRemove.forEach(studentToRemove => {
      const student = students.find(s => s.id === studentToRemove.id);
      if (student) {
        console.log(`移除学生 ${student.name} (${student.studentId}) 的宿舍分配`);
        student.dormBuilding = '';
        student.dormRoom = '';
        student.bedNumber = '';
        fixedCount++;
      }
    });
  });
  
  // 保存修复后的数据
  fs.writeFileSync(studentsPath, JSON.stringify(students, null, 2), 'utf8');
  
  console.log(`\n✓ 修复完成！共处理 ${fixedCount} 名学生`);
  console.log('已清空超员学生的宿舍分配信息，您可以在宿舍管理中重新分配这些学生');
} else {
  console.log('\n如需查看详细信息，可以运行此脚本。');
  console.log('如需自动修复，请运行: node fix-dormitory-capacity.js --fix');
}

